package multithreading;

/**
 * @Author: 海琳琦
 * @Date: 2022/4/3 16:41
 * 模拟死锁: 不同的线程分别占用对方需要的资源不放弃，并且都在等待对方释放自己需要的同步资源
 * 说明：死锁不会抛异常，只是线程处于阻塞状态
 * 解决：专门的算法原则、减少同步资源的定义、避免同步嵌套（同步方法中再调用同步方法）
 */
public class DeadLock {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer();
        StringBuffer s2 = new StringBuffer();
        new Thread(){
            @Override
            public void run() {
                synchronized (s1){
                    s1.append("test1:s1:");
                    //在其等待的0.1s时，线程二可能占用cpu资源从而抢占资源s2，并等待资源s1的释放
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //线程一等待s2的资源释放
                    synchronized(s2){
                        s2.append("test1:s1:");
                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }.start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (s2){
                    s2.append("test2:s1:");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized(s1){
                        s1.append("test2:s1:");
                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }).start();
    }
}
